S3 sync と S3 レプリケーションでオブジェクトコピーした時の S3 イベントの違いについて調べてみた
こんにちは、岩城です。
ある S3 バケットから別バケットにオブジェクトを同期する方法の中に、S3 Sync と S3 レプリケーションがあります。どちらも同期元バケットから同期先バケットにオブジェクトをコピーするものです。
オブジェクトがコピーされたことをトリガーに何か別の処理を実行したいと考えることはよくあります。そこで利用する機能として S3 イベント通知や EventBridge があります。
本エントリでは、同期先バケットにオブジェクトが作成されたことをトリガーに S3 イベント通知を介し、SQS にキューイングするケースを想定して話しを進めます。
S3 イベント通知は、どのイベントをトリガーとするか細かく設定することができます。どのようなイベントがあるか気になる方は公式ドキュメントを確認してください。
それでは本題です。S3 sync と S3 レプリケーションで同期先バケットにオブジェクトが作成された際のイベントは何でしょうか?s3:ObjectCreated:Put
でしょうか?s3:ObjectCreated:Copy
でしょうか?
結論からいうと、S3 sync は s3:ObjectCreated:Copy
で、S3 レプリケーションはs3:ObjectCreated:Put
でした。個人的に Copy だろうなぁと考えていたのでとても意外に感じました。
以下より、S3 sync や S3 レプリケーションの説明共に、実際に試した方法を記載していきます。
S3 sync
S3 sync は、ローカルディレクトリとバケット間やバケット同士を同期するコマンドです。マネジメントコンソールからは利用できず、AWS CLI で利用できます。 今回はバケット間を同期してみます。
# sync 元の S3 バケットににあるファイル $ aws s3 ls s3://iwaki-test-20200701 2020-07-01 16:56:13 0 test_001.txt # sync $ aws s3 sync s3://iwaki-test-sync-20200701 s3://iwaki-test-20200701 copy: s3://iwaki-test-sync-20200701/test_001.txt to s3://iwaki-test-20200701/test_001.txt # sync 先の S3 バケット $ aws s3 ls s3://iwaki-test-replicate-20200701 2020-07-01 16:56:13 0 test_001.txt
S3 レプリケーション
S3 レプリケーションは、バケット間でオブジェクトを非同期コピーする機能です。別アカウントでも別リージョンでもコピーすることができます。 以下は、同一アカウント、同一リージョンで試してみた内容です。
レプリケーションを有効化するバケット、レプリケーション先のバケットは共にバージョニングを有効化する必要があります。事前に有効化していなくても、レプリケーションを設定する最中に有効化できます。
有効化するとソースの設定をします。今回の検証では拘りがないので、ソースバケットのすべてのコンテンツをレプリケーションの対象としました。
レプリケート先のバケットを指定します。
既存のロールがあれば指定します。今回は新しいロールを作成しました。マネジメントコンソールから操作すれば、指定した名前でロールを作成してくれます。
確認して保存するとレプリケーションが有効化されます。
レプリケーションが有効化された後に、ソースバケットに置いたファイルがレプリケート先のバケットにコピーされていることが分かります。ポイントは有効化された後に更新されたファイルがコピーされることです。ソースバケットに元々存在するファイルはコピーされませんので注意してください。
イベントの違いを調べてみる
前置きが長くなりました。それでは S3 Sync と S3 レプリケーションで同期先バケットに作成されたオブジェクトのイベントの違いを見てみます。
検証方法は以下のような感じです。
同期先バケットに設定する S3 イベント通知の内容は以下のような感じになります。
S3 sync や S3 レプリーケーションする手順は前述しているので省略します。同期元バケットから同期先バケットにオブジェクトが作成されたことをトリガーに SQS にメッセージがキューイングされます。
SQS の先には何もなくキューイングされたまま残るので、簡単にメッセージの内容を確認することができます。
以下メッセージ内容です。
S3 Sync のイベント詳細
ObjectCreated:Copy
ですね。
{ "Records": [ { "eventVersion": "2.1", "eventSource": "aws:s3", "awsRegion": "ap-northeast-1", "eventTime": "2020-07-01T07:56:09.733Z", "eventName": "ObjectCreated:Copy", "userIdentity": { "principalId": "AWS:XXXXXXXXXXXXXXXXXXXXX" }, "requestParameters": { "sourceIPAddress": "XXX.XXX.XXX.XXX" }, "responseElements": { "x-amz-request-id": "XXXXXXXXXXXXXXXX", "x-amz-id-2": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" }, "s3": { "s3SchemaVersion": "1.0", "configurationId": "s3-sync-event", "bucket": { "name": "iwaki-test-20200701", "ownerIdentity": { "principalId": "XXXXXXXXXXXXXX" }, "arn": "arn:aws:s3:::iwaki-test-20200701" }, "object": { "key": "test_sync.txt", "size": 0, "eTag": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "versionId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "sequencer": "XXXXXXXXXXXXXXXXXX" } } } ] }
S3 レプリケーションのイベント詳細
ObjectCreated:Put
ですね。
{ "Records": [ { "eventVersion": "2.1", "eventSource": "aws:s3", "awsRegion": "ap-northeast-1", "eventTime": "2020-07-01T07:33:25.544Z", "eventName": "ObjectCreated:Put", "userIdentity": { "principalId": "AWS:XXXXXXXXXXXXXXXXXXXXX" }, "requestParameters": { "sourceIPAddress": "XXX.XXX.XXX.XXX" }, "responseElements": { "x-amz-request-id": "XXXXXXXXXXXXXXXX", "x-amz-id-2": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" }, "s3": { "s3SchemaVersion": "1.0", "configurationId": "s3-replication-event", "bucket": { "name": "iwaki-test-replicate-20200701", "ownerIdentity": { "principalId": "XXXXXXXXXXXXXX" }, "arn": "arn:aws:s3:::iwaki-test-replicate-20200701" }, "object": { "key": "test_replication.txt", "size": 0, "eTag": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "versionId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "sequencer": "XXXXXXXXXXXXXXXXXX" } } } ] }
おわりに
すべてのオブジェクト作成イベント
をトリガーにするケースもあると思いますが、以下のようにイベントの違いをちゃんと知れて良かったです。
- S3 sync されたオブジェクトのイベントは
ObjectCreated:Copy
- S3 レプリケーションされたオブジェクトのイベントは
ObjectCreated:Put
本エントリがどなたかのお役に立てれば幸いです。